package cn.itcast.service.cargo.impl;

import cn.itcast.dao.cargo.ContractDao;
import cn.itcast.dao.cargo.ContractProductDao;
import cn.itcast.dao.cargo.ExtCproductDao;
import cn.itcast.domain.cargo.*;
import cn.itcast.service.cargo.ContractProductService;
import cn.itcast.vo.ContractProductVo;
import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Date;
import java.util.List;
import java.util.UUID;

@Service
public class ContractProductServiceImpl implements ContractProductService {

    @Autowired
    private ContractProductDao contractProductDao;

    @Autowired
    private ContractDao contractDao;

    @Autowired
    private ExtCproductDao extCproductDao;

    //货物的分页
    @Override
    public PageInfo<ContractProduct> findByPage(ContractProductExample contractProductExample, int pageNum, int pageSize) {
        //1.设置当前页与页面大小
        PageHelper.startPage(pageNum,pageSize);
        //2 .查询数据
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);

        //3. 构建PageInfo
        PageInfo<ContractProduct> pageInfo = new PageInfo<>(contractProductList);
        return pageInfo;
    }

    //根据条件查询
    @Override
    public List<ContractProduct> findAll(ContractProductExample contractProductExample) {
        List<ContractProduct> contractProductList = contractProductDao.selectByExample(contractProductExample);
        return contractProductList;
    }

    //根据主键查询货物
    @Override
    public ContractProduct findById(String id) {
        return contractProductDao.selectByPrimaryKey(id);
    }

    //保存货物
    @Override
    public void save(ContractProduct contractProduct) {
        //补全id
        contractProduct.setId(UUID.randomUUID().toString());
        //补全创建时间与更新时间，因为这两个字段不能为空
        contractProduct.setCreateTime(new Date());
        contractProduct.setUpdateTime(new Date());
//        1. 计算货物的总价
        double amount=0;
        if(contractProduct.getCnumber()!=null&&contractProduct.getPrice()!=null){
            amount = contractProduct.getCnumber()*contractProduct.getPrice();
            //把货物的总价设置给货物
            contractProduct.setAmount(amount);
        }
//        2. 插入货物
        contractProductDao.insertSelective(contractProduct);
//        3. 重新计算购销合同总价   总价=原来购销合同的总价+货物总价
        //找到购销合同
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        if(contract.getTotalAmount()!=null) {
            contract.setTotalAmount(contract.getTotalAmount() + amount);
        }else{
            contract.setTotalAmount(amount);
        }

//        4. 计算购销合同的货物种类数量   +1
        if(contract.getProNum()!=null) {
            contract.setProNum(contract.getProNum() + 1);
        }else{
            contract.setProNum(1);
        }
//        5. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);


    }

    //更新货物
    @Override
    public void update(ContractProduct contractProduct) {
        //查询原来货物
        ContractProduct oldContractProduct = contractProductDao.selectByPrimaryKey(contractProduct.getId());
        contractProduct.setUpdateTime(new Date());
//        1. 计算货物的总价
        double amount=0;
        if(contractProduct.getCnumber()!=null&&contractProduct.getPrice()!=null){
            amount = contractProduct.getCnumber()*contractProduct.getPrice();
            //把货物的总价设置给货物
            contractProduct.setAmount(amount);
        }
//        2.更新货物
        contractProductDao.updateByPrimaryKeySelective(contractProduct);
//        3. 修改购销合同的总价   购销合同的总价 = 原购销合同的总价-货物原总价+当前货物的总价
        Contract contract = contractDao.selectByPrimaryKey(contractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount()-oldContractProduct.getAmount()+ amount );

//        4. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);
    }

    //根据主键删除货物
    @Override
    public void delete(String id) {
        //删除货物之前先把货物查询出来，因为后面需要使用货物的数据
        ContractProduct dbContractProduct = contractProductDao.selectByPrimaryKey(id);
//        1. 删除货物
        contractProductDao.deleteByPrimaryKey(id);
//        2. 删除货物对应的附件
        //找到货物对应的附件
        ExtCproductExample extCproductExample = new ExtCproductExample();
        //该货物的附件i
        extCproductExample.createCriteria().andContractProductIdEqualTo(id);
        List<ExtCproduct> extCproductList = extCproductDao.selectByExample(extCproductExample);
        //定义一个变量记录所有附件的总价
        double totalExtAmount = 0;
        //遍历附件，逐个删除附件
        if(extCproductList!=null){
            for (ExtCproduct extCproduct : extCproductList) {
                totalExtAmount+=extCproduct.getAmount();
                // //遍历附件，逐个删除附件
                extCproductDao.deleteByPrimaryKey(extCproduct.getId());
            }
        }

//        3. 修改购销合同的价格  购销合同的价格= 原购销合同的价格-货物的总价-附件的总价
        Contract contract =contractDao.selectByPrimaryKey(dbContractProduct.getContractId());
        contract.setTotalAmount(contract.getTotalAmount()-dbContractProduct.getAmount()- totalExtAmount);

//        4. 修改购销合同的货物种类数量  -1
        contract.setProNum(contract.getProNum()-1);
//        5. 修改购销合同附件的种类数量   购销合同原附件种类数量- 该货物的附件种类数量
        if(contract.getExtNum()!=null) {
            contract.setExtNum(contract.getExtNum()-extCproductList.size());
        }
//        6. 更新购销合同
        contractDao.updateByPrimaryKeySelective(contract);

    }



    //根据船期查找出货表的数据
    @Override
    public List<ContractProductVo> findByShipTime(String companyId, String shipTime) {
        return contractProductDao.findByShipTime(companyId,shipTime);
    }


}
